import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;

import javax.swing.JOptionPane;

@SuppressWarnings("serial")
public class Participante extends UnicastRemoteObject implements InterfaceParticipante {
	
	Colecionador colecionador;
	protected Participante(Colecionador colecionador) throws RemoteException {
		this.colecionador = colecionador;
	}
	 
	/**
	 * @see InterfaceParticipante#iniciarTransacao(int, java.lang.String)
	 */
	public boolean iniciarTransacao(String codTransacao, String operacao) throws RemoteException{
		
		String[] operSplit = operacao.split(" "); 
		int response = 0;
		
		boolean decisao = false;
		
		if(operSplit.length>2){
			String pergunta = "Aceitar transacao de troca desse (seu) item: " + operSplit[colecionador.INDEX_MEU_PRODUTO]+" por esse item : "+operSplit[colecionador.INDEX_SEU_PRODUTO] + " de "+ 
		    		operSplit[colecionador.INDEX_SEU_NOME];
			
			response = JOptionPane.showConfirmDialog(null, pergunta, "Confirm", 
					JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
			
			Transacao trans = null;
		    if (response == JOptionPane.YES_OPTION ) {
		    	long time = System.currentTimeMillis();
		    	trans = new Transacao(colecionador, codTransacao, operacao, operSplit[colecionador.INDEX_SEU_NOME]);

		    	trans.start();
		    	
				colecionador.addTransacao(trans);
				
				trans.efetuaOperacao();
				trans.setStatus(Transacao.EFETIVACAO_PROV);
				
		    	decisao = true;
		    } 
		    else
		    	trans.setStatus(Transacao.FALHA);
			
			try {
				trans.persistenciaParcial();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		    
		}
		else{
			String pergunta = "Aceitar consulta de seus itens feita por: " + operSplit[colecionador.INDEX_SEU_NOME];
			
			response = JOptionPane.showConfirmDialog(null, pergunta, "Confirm", 
					JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
			
		    if (response == JOptionPane.YES_OPTION) {
		    	decisao = true;
		    } 
		}
		
		return decisao;
	}
	 
	/**
	 * @see InterfaceParticipante#desejaEfetivar(int)
	 * 
	 *  
	 */
	public boolean desejaEfetivar(String codTransacao) throws RemoteException{
		
		Transacao trans = colecionador.buscaTransacao(codTransacao);
		boolean decisao = colecionador.getEfetProvisoria();
		
		if(decisao && trans.getStatus() != Transacao.ABORTADA){
			trans.setStatus(Transacao.EFETIVACAO_PROV);
		}
		else{
			trans.setStatus(Transacao.FALHA);
		}
		
		return decisao;
	}
	 
	/**
	 * @see InterfaceParticipante#efetivar(int)
	 */
	public void efetivar(String codTransacao) throws RemoteException{
		
		Transacao trans = colecionador.buscaTransacao(codTransacao);
		try {
			trans.efetivaTransacao();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	 
	/**
	 * @see InterfaceParticipante#abortar(int)
	 */
	public void abortar(String codTransacao) throws RemoteException{
		
		Transacao trans = colecionador.buscaTransacao(codTransacao);
		trans.abortaTransacao();
	}
	 
	/**
	 * @see InterfaceParticipante#getDados()
	 */
	public ArrayList <String> getDados() throws RemoteException{
		ArrayList <String> dados = new ArrayList<String>();
		for(Colecao c : colecionador.getColecoes()){
			dados.add(c.getNome()+" "+c.getQuantidade());
		}
		return dados;
	}
	 
}
 
